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

CMake 中如何指定一个 target 执行文件的输出位置?

  •  
  •   codechaser · 2019-05-21 15:04:50 +08:00 · 5967 次点击
    这是一个创建于 2012 天前的主题,其中的信息可能已经有所发展或是发生改变。

    谢谢各位! 如题,假设

    add_executable(dense_mapping src/dense_mapping.cpp)
    

    怎么可以让dense_mapping这个二进制文件输出到指定目录?有类似set_property之类的吗?EXECUTABLE_OUTPUT_PATH是全局的,并不想这样.

    14 条回复    2019-05-22 11:51:18 +08:00
    yuikns
        1
    yuikns  
       2019-05-21 15:09:34 +08:00
    codechaser
        2
    codechaser  
    OP
       2019-05-21 15:22:38 +08:00
    @yuikns 不是,我是指编写边编译测试的时候能不能修改这个文件的默认输出目录.不过 install 好像确实这样诶,我去试试.
    codechaser
        3
    codechaser  
    OP
       2019-05-21 15:49:46 +08:00
    @yuikns 请教一下为啥 cmake 和 make 之后生成的可执行文件可以正常运行,一但 make install 之后到对应目录里去运行就会显示找不到 so?
    capric
        4
    capric  
       2019-05-21 16:04:19 +08:00   ❤️ 1
    set_target_properties(
    dense_mapping
    PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/../../rundir"
    )

    ${CMAKE_BINARY_DIR} 是默认输出位置
    capric
        5
    capric  
       2019-05-21 16:06:18 +08:00
    改输出名字也是可以的
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set(suffix "64")
    else()
    set(suffix "32")
    endif()

    # set_target_properties(${name} PROPERTIES OUTPUT_NAME "dense_mapping${suffix}")
    codechaser
        6
    codechaser  
    OP
       2019-05-21 16:39:17 +08:00
    @capric 你好,能解答一下我上面问的问题吗?make install 之后就找不到 so 了
    codehz
        7
    codehz  
       2019-05-21 20:27:12 +08:00
    install 后找不到 so 可能是 RPATH 的问题,由于不清楚你的具体情况,你可以自己去谷歌以下关键词:cmake rpath
    LouisLiu
        8
    LouisLiu  
       2019-05-21 20:50:00 +08:00 via iPhone
    set(cmake_install_prefix "/home/")可以
    secondwtq
        9
    secondwtq  
       2019-05-21 21:15:00 +08:00
    我也想到 install,不过看帖子之后觉得不如你 CMakeLists 里面加条命令直接复制算了,install 是发布出去之后给用户部署用的,不应该有那么多开发者个人乱七八糟的需求掺在里面

    另外其实更合适的是在对应目录下建个 symlink 指向默认输出位置
    Hconk
        10
    Hconk  
       2019-05-21 23:31:09 +08:00 via iPhone
    找不到 so 可以用,readelf -d ./dense_mapping 或者 ldd 命令在你 install 和不用 install 时候做下对比就知道为什么缺少 so 了,一般就是楼上说的 rpath 路径里面估计是相对路径,换个位置就找不到 so 了,可以在 rpath 个 . (当前目录) ,然后 install 的时候把.so 和目标程序一起 install 到同一个文件夹就行了。
    qieqie
        11
    qieqie  
       2019-05-22 10:39:15 +08:00
    https://cmake.org/cmake/help/v3.10/command/file.html
    FILE(COPY xxx DESTINATION xxx)

    install 后会默认把 rpath 置空,所以要把 install 的路径加到 path 里,或者 SET(CMAKE_INSTALL_RPATH "")
    codechaser
        12
    codechaser  
    OP
       2019-05-22 11:43:16 +08:00 via Android
    @Hconk 昨天发现 install 之后的二进制用 LD_DEBUG=libs 看了一下,发现一些库没找,我到 /etc/ld.conf.d 里面加了个文件,然后 sudo ldconfig 就好了。
    codechaser
        13
    codechaser  
    OP
       2019-05-22 11:45:42 +08:00 via Android
    @Hconk 而且我用的 so 不是相对路径,是另一个版本的 opencv,我安装到了 /opt 下面
    codechaser
        14
    codechaser  
    OP
       2019-05-22 11:51:18 +08:00 via Android
    @secondwtq 这个办法好!我竟然没想到,多谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2795 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:22 · PVG 22:22 · LAX 06:22 · JFK 09:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.