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

2019-05-21 15:04:50 +08:00
 codechaser

谢谢各位! 如题,假设

add_executable(dense_mapping src/dense_mapping.cpp)

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

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

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

另外其实更合适的是在对应目录下建个 symlink 指向默认输出位置
Hconk
2019-05-21 23:31:09 +08:00
找不到 so 可以用,readelf -d ./dense_mapping 或者 ldd 命令在你 install 和不用 install 时候做下对比就知道为什么缺少 so 了,一般就是楼上说的 rpath 路径里面估计是相对路径,换个位置就找不到 so 了,可以在 rpath 个 . (当前目录) ,然后 install 的时候把.so 和目标程序一起 install 到同一个文件夹就行了。
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
2019-05-22 11:43:16 +08:00
@Hconk 昨天发现 install 之后的二进制用 LD_DEBUG=libs 看了一下,发现一些库没找,我到 /etc/ld.conf.d 里面加了个文件,然后 sudo ldconfig 就好了。
codechaser
2019-05-22 11:45:42 +08:00
@Hconk 而且我用的 so 不是相对路径,是另一个版本的 opencv,我安装到了 /opt 下面
codechaser
2019-05-22 11:51:18 +08:00
@secondwtq 这个办法好!我竟然没想到,多谢。

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

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

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

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

© 2021 V2EX