Makefile Cmake共享库

Makefile Cmake共享库,makefile,cmake,Makefile,Cmake,我正在学习CMake,但我很难理解如何将二进制文件链接到共享库,然后将这些文件安装到发布文件夹中 以下是我的项目结构: ├── CMakeLists.txt ├── build ├── main │   ├── CMakeLists.txt │   └── main.cpp ├── release |_______bin │   ├── include │   │   └── math.h │   └── lib │   └── libmathLib.dylib └── shared_

我正在学习CMake,但我很难理解如何将二进制文件链接到共享库,然后将这些文件安装到发布文件夹中

以下是我的项目结构:

├── CMakeLists.txt
├── build
├── main
│   ├── CMakeLists.txt
│   └── main.cpp
├── release
|_______bin 
│   ├── include
│   │   └── math.h
│   └── lib
│       └── libmathLib.dylib
└── shared_lib
    ├── CMakeLists.txt
    ├── include
    │   └── math.h
    └── src
        └── math.cpp
在根CMakeLists.txt中,我定义了项目设置和子目录

根目录CMakeLists.txt:

cmake_minimum_required(VERSION 3.1)

project (Math)
set(CMAKE_BUILD_TYPE Release)

set(MAKE_INCLUDE_CURRENT_DIR ON)

ADD_SUBDIRECTORY(shared_lib)
ADD_SUBDIRECTORY(main)
Main CMakeLists.txt:

add_executable(main main.cpp)
TARGET_LINK_LIBRARIES(main LINK_PUBLIC mathLib)
数学库(共享库)

当我使用Make构建项目时,它不会将main.o链接到共享库。错误:

Scanning dependencies of target mathLib
[ 50%] Building CXX object shared_lib/CMakeFiles/mathLib.dir/src/math.cpp.o
Linking CXX shared library libmathLib.dylib
[ 50%] Built target mathLib
Scanning dependencies of target main
[100%] Building CXX object main/CMakeFiles/main.dir/main.cpp.o
/Users/giuseppe/development/cmake/main/main.cpp:8:12: error: use of undeclared identifier 'sum'
  count << sum(5,6) << endl;
           ^
1 error generated.
make[2]: *** [main/CMakeFiles/main.dir/main.cpp.o] Error 1
make[1]: *** [main/CMakeFiles/main.dir/all] Error 2
make: *** [all] Error 2 
扫描目标mathLib的依赖项
[50%]构建CXX对象共享库/cmakfiles/mathLib.dir/src/math.cpp.o
链接CXX共享库libmathLib.dylib
[50%]构建目标mathLib
扫描目标主机的依赖项
[100%]构建CXX对象main/cmakfiles/main.dir/main.cpp.o
/Users/giuseppe/development/cmake/main/main.cpp:8:12:错误:使用未声明的标识符“sum”

count您必须将库的include目录添加到
main/CMakeLists.txt
。将其添加到
shared_lib/CMakeLists.txt
是不够的。试试这句话:

include_directories("../shared_lib/include")

必须将库的包含目录添加到
main/CMakeLists.txt
。将其添加到
shared_lib/CMakeLists.txt
是不够的。试试这句话:

include_directories("../shared_lib/include")


可执行文件的名称是
math
,您正试图链接到名为
main
的目标。这是一个输入错误吗?@HeyYO谢谢,是的,这是一个输入错误。
使用未声明的标识符是一个编译器错误,而不是链接器错误。你的包裹有问题。你确定
math.h
在你的include路径中吗?我假设这个文件声明了
sum()
。哦,顺便说一下,
math.h
是C标准数学库的名称。不要将此名称用于您自己的文件!它包括标准的数学库。现在,我将名称更改为my_math.h,它找不到头文件。您的可执行文件名为
math
,您正在尝试链接到名为
main
的目标。这是一个输入错误吗?@HeyYO谢谢,是的,这是一个输入错误。
使用未声明的标识符是一个编译器错误,而不是链接器错误。你的包裹有问题。你确定
math.h
在你的include路径中吗?我假设这个文件声明了
sum()
。哦,顺便说一下,
math.h
是C标准数学库的名称。不要将此名称用于您自己的文件!它包括标准的数学库。现在我将名称改为my_math.h,它找不到头文件,因为我正在共享的\u lib/CMakeList.txt中设置
include\u目录(${Cmake\u CURRENT\u SOURCE\u DIR}/include)
。不。使用父
CMakeList.txt
文件不会将子CMakeList.txt文件合并在一起。它们仍然是独立的项目。如果你想声明一次包含,你可以使用一个CMakeList.txt文件。这就是我想要做的。例如,在顶级CMakeLists.txt中声明所有包含是个好主意吗?我认为这不是个好主意。您将项目划分为不同的部分是有原因的。其中之一是简化依赖关系管理。当您将所有包含项都包含在一个文件中时,不清楚哪个子项目依赖于哪个子项目。看一看,也许这就是你想要的。我需要的是shared\u lib/CMakeLists.txt中的
target\u include\u目录(mathLib PUBLIC${CMAKE\u CURRENT\u SOURCE\u DIR}/include)
,这样在编译main时就可以访问它的头文件了。难道我不应该因为我正在设置
include\u目录而自动计算出那个路径吗(${CMAKE_CURRENT_SOURCE_DIR}/include)
在shared_lib/CMakeList.txt中?否。使用父级
CMakeList.txt
文件不会将子CmakeLists.txt文件合并在一起。它们仍然是单独的项目。如果要声明一次包含,可以使用单个CMakeList.txt文件。这就是我想要做的。例如,最好声明所有包含In顶级的CMakeLists.txt?我认为这不是一个好主意。你将项目分为不同的部分是有原因的。其中之一是为了更容易地进行依赖关系管理。当你将所有包含项都放在一个文件中时,不清楚哪个子项目取决于哪个。看看,也许这就是你想要的。我需要的是
t在shared_lib/CMakeLists.txt中的arget_include_目录(mathLib PUBLIC${CMAKE_CURRENT_SOURCE_DIR}/include)
,以便在编译main.cpp时可以访问其头文件