现有如下cmake项目,根目录下包含一个include文件夹,内有header.h,根目录下还有src文件夹,内有文件main.cpp,header.cpp,两个文件均引用header.h,在构建main时出现undefined_reference
时间: 2024-02-28 07:53:35 浏览: 150
这个问题可能是由于编译器找不到header.cpp文件引用的库文件导致的。可以尝试在CMakeLists.txt文件中添加以下代码:
```cmake
add_library(header header.cpp)
```
然后在main.cpp文件中添加以下代码来链接库文件:
```cmake
target_link_libraries(main header)
```
这样应该就能够解决undefined reference的问题了。同时,需要确保header.cpp中所有的函数都被正确地实现了。
相关问题
现有如下cmake项目,根目录下包含一个include文件夹,内有header.h,根目录下还有src文件夹,内有文件main.cpp,header.cpp,两个文件均引用header.h,src文件夹以及项目根目录下均有cmakelists.txt,给出cmakelists.txt代码
以下是一个可能的CMakeLists.txt文件的示例代码:
在项目根目录下的CMakeLists.txt文件:
```cmake
cmake_minimum_required(VERSION 3.10)
project(project_name)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
# 添加 include 目录
include_directories(include)
# 添加 src 子目录
add_subdirectory(src)
# 添加可执行文件
add_executable(main main.cpp)
# 链接库文件
target_link_libraries(main header)
```
在src子目录下的CMakeLists.txt文件:
```cmake
# 添加头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
# 添加库文件
add_library(header header.cpp)
```
这样应该就能够正确地构建项目了。注意要将src目录下的CMakeLists.txt文件添加到项目根目录下的CMakeLists.txt文件中。
现有如下cmake项目,根目录下包含一个include文件夹,内有header.h,根目录下还有src模块和test模块,src内有文件main.cpp,header.cpp,两个文件均引用header.h,src文件夹以及项目根目录下均有cmakelists.txt,main.cpp中使用了在header.cpp中定义的函数,但是构建时出现undefined_reference
出现 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 中,编译出一个新的可执行文件。
阅读全文