【问题标题】:cmake create a shared objectcmake 创建一个共享对象
【发布时间】:2012-07-02 20:40:25
【问题描述】:

我有三个文件:

lib.c lib.h => 它们应该被构建为 .so 文件
client.c => 这应该被构建为可执行文件。
在 client.c 中,我包含了 lib.h 文件,以便获取 lib.c 下定义的函数的声明

谁能告诉我我应该使用的确切 CMakeLists 文件,以便源区域不会被 Cmake 的临时文件和二进制文件和库(我相信是 windows 的情况下为 .dll)在单独的构建和二进制目录中生成?

【问题讨论】:

    标签: build cmake shared-libraries


    【解决方案1】:

    此解决方案不会创建 .so 文件,而是创建一个等效的 cmake,以便进一步包含在 cmake 中。
    我正在寻找一个解决方案,将提供与此等效的解决方案:

    g++ -shared -Wl,-soname,plugin_lib.so.1 -o plugin_lib.so plugin_lib.o
    

    这将生成一个plugin_lib.so,可以在运行时使用 dlopen 动态加载。

    解决方案缺少“共享”选项,如下所示:

    ADD_LIBRARY(mylib SHARED ${mylibSRCS})
    

    【讨论】:

      【解决方案2】:

      默认情况下,Cmake 在单独的构建目录上构建(我没有测试这个例子):

      PROJECT(myproject)
      CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
      
      SET(mylibSRCS lib.c)
      SET(myprogSRCS client.c)
      
      ADD_LIBRARY(mylib ${mylibSRCS})
      ADD_EXECUTABLE(myprog ${myprogSRCS})
      
      TARGET_LINK_LIBRARIES(myprog mylib)
      

      你这样做:

      mkdir build
      cd build
      cmake ..
      make
      

      一切都在构建中。

      更新:正如下面@chryss 所提到的,如果你想生成.so 文件,命令应该是:

      ADD_LIBRARY(mylib SHARED ${mylibSRCS})
      

      【讨论】:

      • 有没有办法在不执行这些 shell 命令的情况下始终在新目录中进行构建?我用谷歌搜索,但找不到任何有用的链接。
      • 是的。你可以mkdir build & cd build & cmake .. & make。如果您需要超级清理您的存储库,只需删除构建目录。这会将生成的内容与您的原始来源隔离开来。
      • ADD_LIBRARY(mylib SHARED ${mylibSRCS}),如下面的@chryss 所述。
      猜你喜欢
      • 2020-05-05
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 2018-08-25
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多