现有如下cmake项目,根目录下包含一个include文件夹,内有header.h,根目录下还有src模块和test模块,src内有文件main.cpp,header.cpp,两个文件均引用header.h,src文件夹以及项目根目录下均有cmakelists.txt,main.cpp中使用了在header.cpp中定义的函数,但是构建时出现undefined_reference
时间: 2024-02-28 21:53:59 浏览: 78
出现 undefined reference 的原因是链接器没有找到对应的函数实现。在你的项目中,需要将 header.cpp 编译成一个库文件(静态库或动态库),然后在链接时将该库文件链接到你的可执行文件中。
具体操作方法如下:
1. 在 header.cpp 中定义的函数前面加上 `extern "C"`,例如:
```c++
extern "C" {
void my_function() {
// function implementation
}
}
```
这样可以避免 C++ 名字修饰导致的链接错误。
2. 在根目录下的 CMakeLists.txt 中添加以下内容:
```cmake
# 编译 header.cpp 为一个静态库
add_library(mylib STATIC ${CMAKE_CURRENT_SOURCE_DIR}/header.cpp)
# 或编译为一个动态库
# add_library(mylib SHARED ${CMAKE_CURRENT_SOURCE_DIR}/header.cpp)
# 添加头文件路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
# 编译可执行文件
add_executable(myapp ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp)
# 链接静态库
target_link_libraries(myapp mylib)
# 或链接动态库
# target_link_libraries(myapp mylib_shared)
```
这样就可以将 header.cpp 编译成一个库文件,并将其链接到可执行文件中,解决 undefined reference 的问题。
如果你的 test 模块也需要使用该库文件,则可以将上述内容复制到 test 模块的 CMakeLists.txt 中,编译出一个新的可执行文件。
阅读全文