V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
kanhongj
V2EX  ›  问与答

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

  •  
  •   kanhongj · 2022-04-29 10:49:28 +08:00 · 878 次点击
    这是一个创建于 937 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原因

    当前目录结构树如下

    ---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 而使用别的方式去获取到版本信息

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2481 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:54 · PVG 23:54 · LAX 07:54 · JFK 10:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.