首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  C/C++/Obj-C

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

  •  
  •   opiviqo · 2018-08-09 15:04:39 +08:00 · 1506 次点击
    这是一个创建于 373 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如图所示文件夹
    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:
    4 回复  |  直到 2018-08-10 14:29:08 +08:00
        1
    gnaggnoyil   2018-08-09 18:31:48 +08:00
    main.c 在 test 目录下吗.不在当然找不到
        2
    opiviqo   2018-08-10 09:42:41 +08:00
    @gnaggnoyil 你好,感谢回复!
    先回答你的问题:main.c 在 tests 目录下;
    进一步说明:我这边编译其实两个文件
    1,库文件( libx.a );
    2,执行文件( bin );
    问题就是:如果我屏蔽掉编译执行文件的部分,先编译库文件,可以正常生成库文件;
    在生成了库文件的前提下,恢复执行文件编译部分,可以编译成执行文件。

    但是,我直接编译就会提示找不到库文件,且连库文件都编译不出。
        3
    wutiantong   2018-08-10 10:44:19 +08:00   ♥ 1
    @opiviqo tests 里面的 CMakeLists.txt 写成这样就行了:
    ADD_EXECUTABLE(bin main.c)
    TARGET_LINK_LIBRARIES(bin bns)
        4
    opiviqo   2018-08-10 14:29:08 +08:00
    @wutiantong 感谢!完结
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2169 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 13:30 · PVG 21:30 · LAX 06:30 · JFK 09:30
    ♥ Do have faith in what you're doing.