【发布时间】:2021-04-09 10:34:46
【问题描述】:
我正在尝试在项目中包含一个项目。 相关结构如下:
projectA
/CMakeLists.txt (PA1)
/src
/main.cpp
/req/projectB
/CMakeLists.txt (PB1)
/src
/projb.hpp
/projb.cpp
/CMakeLists.txt (PB2)
编译后,如果我注释掉 projb.cpp 中的所有内容(并在标头中定义),则链接成功,但由于未定义的引用(对 projb.cpp 中定义的任何函数)而失败。
-(PA1)-
add_subdirectory("req/projectB")
include_directories(${PROJECT_NAME} "req/projectB/src")
add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} INTERFACE projectB)
-(PB1)-
add_subdirectory(src)
-(PB2)-
add_library(projectB projb.hpp projb.cpp)
main.cpp
int main() {
project_b::doStuff();
return 1;
}
projb.hpp
namespace project_b {
void doStuff(); // fails
void doStuff() {} // works if nothing defined in .cpp
// (only one or the other version is declared not both)
} // end namespace
projb.cpp
namespace project_b {
void doStuff() {} // fails with undefined reference error when called from main
} // end namespace
【问题讨论】:
-
链接器根本不查看 .cpp 文件。运行
make VERBOSE=1查看实际编译命令。 -
我就是这样运行 make
-
这在您的帖子中并不明显。如果
projb.cpp没有被编译,为什么其中定义的东西是未定义的呢? -
当我签入构建文件夹时,projectB 的库就在那里。
-
但它们不用于构建可执行文件
标签: c++ gcc cmake linker-errors undefined-reference