【问题标题】:CMake to build shared object .so files in linuxCMake 在 linux 中构建共享对象 .so 文件
【发布时间】:2013-03-04 10:44:19
【问题描述】:

任务 -> 运行 Cmake 在 windows 中生成 dll,在 linux 中生成共享对象(.so 文件)。

我正在将代码从 windows 移植到 linux 。我已经对源代码进行了必要的更改。我曾尝试更改 CMakeLists.txt 文件,但是当我尝试这样做时,它会抱怨“找不到源文件”。请大家指出我在哪里犯了错误。 CMakeList.txt 如下所示。 cmake 在 Windows 中运行良好,但在 linux 中却报错。
我已经注释了几行并在 CMakeLIsts.txt 中添加了一行以使其在 Linux 中工作,但它不起作用。

CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
CMAKE_POLICY( SET CMP0017 NEW ) 

PROJECT( disk_space_model )
INCLUDE( ../libs/helper_functions.cmake )
INCLUDE_THIRD_PARTY_SFC()

SET(    HEADER_FILES 
        stdafx.h
        INS_sensor_model.h
)

SET(    SOURCE_FILES
        Disk_space_model.cpp
)

SET(    RESOURCE_FILES 
        "Disk Space DLL.rc"
        resource.h
)

COMMON_SETUP()
SETUP_Lab_LIB_FILES( lib_foo lib_boo_files lib_platform lib_utils )

#ADD_DEFINITIONS(-D_USRDLL -DINSSENSORDLL_EXPORTS)
#ADD_LIBRARY( disk_space_model SHARED ${SOURCE_FILES} ${HEADER_FILES} ${RESOURCE_FILES} ${CMAKE_HELPER_FILES} )
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols")
ADD_LIBRARY( disk_space_model [ STATIC | SHARED ] ${SOURCE_FILES} ${HEADER_FILES} ${RESOURCE_FILES}  ${CMAKE_HELPER_FILES} )
SET_OUTPUT_DIRS( disk_space_model )
TARGET_LINK_LIBRARIES( disk_space_model ${LIB_FILES} )

以下是我在配置后生成并在 CMake-gui 上生成时收到的以下错误

  4 bit compiler
-- Configuring done
CMake Error at CMakeLists.txt:37 (ADD_LIBRARY):
  Cannot find source file:

    [

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx


CMake Error in CMakeLists.txt:
  Cannot find source file:

    STATIC

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx


CMake Error in CMakeLists.txt:
  Cannot find source file:

    |

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx


CMake Error in CMakeLists.txt:
  Cannot find source file:

    SHARED

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx


CMake Error in CMakeLists.txt:
  Cannot find source file:

    ]

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx


-- Build files have been written to: /home/mydir/svn/proj1/apps/disk space
make: *** [cmake_check_build_system] Error 1

【问题讨论】:

  • “找不到”哪些源文件?另外,您确定要像这样覆盖CMAKE_SHARED_LINKER_FLAGS 吗?或者只是添加到他们?如果那是您的实际语法,那是错误的:注释行是可以的,但 [ STATIC | SHARED ] not 有效。
  • @Angew,感谢您的回复。好吧,我在问题区域中添加了我的错误消息。问题 2) 你提到了但是 [ STATIC | SHARED ] 无效,但这就是我在 google 上找到的在 linux 中创建 .so 文件的内容。如果这一步是错误的,你能指出为什么它是错误的,什么是正确的?谢谢
  • 这是元语法。这意味着“将STATIC(用于生成静态库)或SHARED(用于生成共享库)放在那里。”这就是你得到的错误。它正在寻找名为[STATIC 等的文件(因为关键字STATICSHARED,如果存在,必须是库名称之后的第一个参数)。只需使用您注释掉的行,就可以了。
  • 这是一个选项列表。 [] 中的所有内容都是可选的,每个有效选项由 | 分隔。所以,它要么是STATIC,要么是SHARED。顺便说一句,如果您阅读 CMake 文档,您还会看到插件库有一个 MODULE 选项。

标签: c++ linux windows cmake


【解决方案1】:

因为这个而坏了:

ADD_LIBRARY( disk_space_model [ STATIC | SHARED ] ${SOURCE_FILES} ${HEADER_FILES} ${RESOURCE_FILES}  ${CMAKE_HELPER_FILES} )

我猜你从文档中复制粘贴了[ STATIC | SHARED ]。这应该是STATICSHARED 的选择(在你的情况下是后者)。

【讨论】:

  • 我已经添加了该行,因为当我使用一个选项尝试 jsut 时,它抱怨缺少文件。例如 c++: 错误: foo: 没有这样的文件或目录 c++: 错误: DLL: 没有这样的文件或目录如果我试图在 Windows 中构建它。它完美无缺。
  • 您也不应该在 ADD_LIBRARY 中包含 HEADER_FILES。这没有意义:源(实现)文件是您在 C++ 中构建的,而不是头文件。
  • @JohnZwinck 不正确。在 CMakeLists 中,您通常会在 add_library()/add_executable() 调用中列出您的头文件,以便它们显示在 Visual Studio 和其他 IDE 的项目文件列表中。它们仍然不会被编译。
  • 我明白了。显然是一种 CMake“错误”或缺失的功能,我从来不知道,因为我从未在 Visual Studio 中使用过 CMake。
  • @JohnZwinck 出于好奇,这是一个“错误”吗? CMakeList 不是 Makefile - add_library() 的参数是“作为库一部分的文件”,而不是(只是)“要编译以创建库的源文件”。 IMO,这是命令的语义,而不是“错误”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2014-02-22
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多