动态库设置版本的一些问题[CMake 编译]

2022-04-29 10:49:28 +08:00
 kanhongj

原因

当前目录结构树如下

---Main
    |---src
    |	  |---CMakeLists
    |     |---A.cpp
    |     |---A.h
    |
    |---test
    |	   |---CMakeLists
    	   |---test.cpp
	   |
    |---CMakeLists

在 Main 中设置了 add_subdirectory src 和 test;

src 中生成一个 libA.so ;

test 中生成执行文件 test ,链接 libA;

为了在 libA 中添加版本信息,我将各个级的 CMakeLists 改成如下:

Main

add_subdirectory(src)
add_subdirectory(test)

src

add_library(A SHARED A.cpp A.h)
set_target_properties(A PROPERTIES VERSION 1.0 SONAME 1)
target_compile_options(A PRIVATE "-fPIC")
add_custom_command(
    TARGET A POST_BUILD
    COMMAND
   	${CMAKE_COMMAND} -E rename ${PROJECT_SOURCE_DIR}/libA.so.1.0	${PROJECT_SOURCE_DIR}/libA.so
)

test

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath=./")
add_executable(test test.cpp)
target_link_libraries(test libA.so)

这样产生的 libA.so , 可以通过 readelf libA.so | grep "SONAME" 看到编译时间,但是也产生了问题。

产生的问题

  1. CMake 会优先编译 test, 然后链接 libA.so , 会报错,找不到 libA.so

  2. 如果将 test 目录下 CMakeLists 改为 target_link_libraries(test A) 虽然 test 后编译,但是会报错,找不到 libA.so.1.0

想问一下各位朋友有没有啥解决方法,在 1.情况下,可以先编译生成 libA ,再去编译链接 test 或者对于版本,有更好的方法,我是希望编译出 libA.so 而使用别的方式去获取到版本信息

717 次点击
所在节点    问与答
0 条回复

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

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

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

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

© 2021 V2EX