请教一个关于 cmake 编译顺序的问题

2018-08-09 15:04:39 +08:00
 opiviqo
如图所示文件夹
project_idr/

├── build

├── src

└── tests

目标:
src 为源文件( src )目录,编译为一个静态库文件;
tests 为执行文件( bin )目录,链接 src 文件夹下的编译好的库文件,编译成多个执行文件;
build 为 cmake 的文件夹。

cmakelists.txt
PROJECT(bns)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(tests)

src/cmakelists.txt
... //省略一些子文件夹定义
ADD_LIBRARY(bns STATIC ${BNS_DIR} ${COM_DIR} ${CRC_DIR} ${MASTER_DIR} ${SLAVE_DIR})

tests/cmakelists.txt
LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/src)
ADD_EXECUTABLE(bin main.c ${PROJECT_BINARY_DIR}/src/liba.a)
TARGET_LINK_LIBRARIES(bin ${PROJECT_BINARY_DIR}/src/liba.a)

那么问题来了:
1,去掉 ADD_SUBDIRECTORY(tests)语句,仅仅编译成一个库文件,可以正常生成库文件;然后,再加入前面的语句,继续编译就可以得到 bin 文件。但是想直接编译得到 bin 文件,就提示找不到库文件。每次编译两次肯定是有问题的,请教各位大佬。

CMake Error at tests/CMakeLists.txt:2 (ADD_EXECUTABLE):
Cannot find source file:
6354 次点击
所在节点    C
4 条回复
gnaggnoyil
2018-08-09 18:31:48 +08:00
main.c 在 test 目录下吗.不在当然找不到
opiviqo
2018-08-10 09:42:41 +08:00
@gnaggnoyil 你好,感谢回复!
先回答你的问题:main.c 在 tests 目录下;
进一步说明:我这边编译其实两个文件
1,库文件( libx.a );
2,执行文件( bin );
问题就是:如果我屏蔽掉编译执行文件的部分,先编译库文件,可以正常生成库文件;
在生成了库文件的前提下,恢复执行文件编译部分,可以编译成执行文件。

但是,我直接编译就会提示找不到库文件,且连库文件都编译不出。
wutiantong
2018-08-10 10:44:19 +08:00
@opiviqo tests 里面的 CMakeLists.txt 写成这样就行了:
ADD_EXECUTABLE(bin main.c)
TARGET_LINK_LIBRARIES(bin bns)
opiviqo
2018-08-10 14:29:08 +08:00
@wutiantong 感谢!完结

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/478282

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX