使用CMakelists导入我自己的共享库

使用CMakelists导入我自己的共享库,cmake,shared-libraries,Cmake,Shared Libraries,我通过添加以下内容在CMakeLists.txt中创建了一个共享库: add_library(mylib SHARED ${SourceDir}) install (TARGETS mylib DESTINATION lib) 现在我可以在安装后在正确的文件夹中看到文件libmylib.so,但我不确定如何将其导入另一个单独项目的CMakeLists.txtCMake不仅允许您安装库,它还可以安装其他项目用于导入库目标的所有详细信息的文件。这使得导入的目标的处理方式与导入目标的处理方式几乎相同

我通过添加以下内容在
CMakeLists.txt
中创建了一个共享库:

add_library(mylib SHARED ${SourceDir})
install (TARGETS mylib DESTINATION lib)

现在我可以在安装后在正确的文件夹中看到文件
libmylib.so
,但我不确定如何将其导入另一个单独项目的
CMakeLists.txt
CMake不仅允许您安装库,它还可以安装其他项目用于导入库目标的所有详细信息的文件。这使得导入的目标的处理方式与导入目标的处理方式几乎相同

第一步是向库的项目中添加其他安装详细信息:

add_library(mylib SHARED ${SourceDir})
install(TARGETS mylib
        EXPORT myproj-targets
        DESTINATION lib
)
install(EXPORT myproj-targets
        DESTINATION lib/myproj
)
注意添加的
EXPORT myproj targets
到原始
install()
调用。这会告诉CMake将您的
mylib
目标包含在它将作为导出集
myproj targets
的一部分导出的目标列表中,然后第二个
install()
会指示CMake作为安装步骤的一部分生成该目标

在要使用库的另一个项目中,您只需要
包含()上述
install()
调用中的第二个将创建的文件。假设您安装到
${installBase}
,下面将导入上面导出的详细信息,并使
mylib
目标可直接使用:

include("${installBase}/lib/cmake/myproj-targets.cmake)
add_executable(myexe exeSources.cpp)
target_link_libraries(myexe PRIVATE mylib)

您可以从和中找到关于所有这些如何工作的合理解释

CMake不仅允许您安装库,还可以安装其他项目用于导入库目标的所有详细信息的文件。这使得导入的目标的处理方式与导入目标的处理方式几乎相同

第一步是向库的项目中添加其他安装详细信息:

add_library(mylib SHARED ${SourceDir})
install(TARGETS mylib
        EXPORT myproj-targets
        DESTINATION lib
)
install(EXPORT myproj-targets
        DESTINATION lib/myproj
)
注意添加的
EXPORT myproj targets
到原始
install()
调用。这会告诉CMake将您的
mylib
目标包含在它将作为导出集
myproj targets
的一部分导出的目标列表中,然后第二个
install()
会指示CMake作为安装步骤的一部分生成该目标

在要使用库的另一个项目中,您只需要
包含()上述
install()
调用中的第二个将创建的文件。假设您安装到
${installBase}
,下面将导入上面导出的详细信息,并使
mylib
目标可直接使用:

include("${installBase}/lib/cmake/myproj-targets.cmake)
add_executable(myexe exeSources.cpp)
target_link_libraries(myexe PRIVATE mylib)

您可以从和中找到关于所有这些如何工作的合理解释

就我所关心的CMake而言,有两种方法可以使用库。如果您不确定现有(和位置)库,则应使用
find
指令。但若你们知道你们应该直接使用图书馆。因此,如果您的另一个
CMakeLists.txt
是使用
libmylib.So
的项目的一部分,您不应该使用它的安装版本。谢谢。CMakeList是另一个项目的一部分,在这种情况下,
CMakeList.txt
应该使用
find
指令。但是根据CMake模块(比如
FindMyLib.CMake
)应该随库提供。如果您不确定现有(和位置)库,则应使用
find
指令。但若你们知道你们应该直接使用图书馆。因此,如果您的另一个
CMakeLists.txt
是使用
libmylib.So
的项目的一部分,您不应该使用它的安装版本。谢谢。CMakeList是另一个项目的一部分,在这种情况下,
CMakeList.txt
应该使用
find
指令。但是根据CMake模块(如
FindMyLib.CMake
)应该随库提供。