Makefile Cmake共享库
我正在学习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_
├── 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时可以访问其头文件