codechaser
V2EX  ›  C

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

  •  
  •   codechaser · May 21, 2019 · 7126 views
    This topic created in 2730 days ago, the information mentioned may be changed or developed.

    谢谢各位! 如题,假设

    add_executable(dense_mapping src/dense_mapping.cpp)
    

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

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

    ${CMAKE_BINARY_DIR} 是默认输出位置
    capric
    capric
    May 21, 2019
    5
    改输出名字也是可以的
    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
    codechaser
    OP
    May 21, 2019
    6
    @capric 你好,能解答一下我上面问的问题吗?make install 之后就找不到 so 了
    codehz
    codehz
    May 21, 2019
    7
    install 后找不到 so 可能是 RPATH 的问题,由于不清楚你的具体情况,你可以自己去谷歌以下关键词:cmake rpath
    LouisLiu
    LouisLiu
    May 21, 2019 via iPhone
    8
    set(cmake_install_prefix "/home/")可以
    secondwtq
    secondwtq
    May 21, 2019
    9
    我也想到 install,不过看帖子之后觉得不如你 CMakeLists 里面加条命令直接复制算了,install 是发布出去之后给用户部署用的,不应该有那么多开发者个人乱七八糟的需求掺在里面

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

    install 后会默认把 rpath 置空,所以要把 install 的路径加到 path 里,或者 SET(CMAKE_INSTALL_RPATH "")
    codechaser
    codechaser
    OP
    May 22, 2019 via Android
    12
    @Hconk 昨天发现 install 之后的二进制用 LD_DEBUG=libs 看了一下,发现一些库没找,我到 /etc/ld.conf.d 里面加了个文件,然后 sudo ldconfig 就好了。
    codechaser
    codechaser
    OP
    May 22, 2019 via Android
    13
    @Hconk 而且我用的 so 不是相对路径,是另一个版本的 opencv,我安装到了 /opt 下面
    codechaser
    codechaser
    OP
    May 22, 2019 via Android
    14
    @secondwtq 这个办法好!我竟然没想到,多谢。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4830 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 02:01 · PVG 10:01 · LAX 18:01 · JFK 21:01
    ♥ Do have faith in what you're doing.