链接共享dll库cmake clion项目
我目前在Clion上有两个C项目和cmake。 其中一个项目名为“sharedLibsDemo”,我正在尝试在此项目中创建一个共享库。 在另一个项目中,我想使用由“共享”项目创建的库。
目前,在“sharedLibsDemo”项目中,我有以下cmake:
cmake_minimum_required(VERSION 3.7) project(sharedLibsDemo) set(CMAKE_C_STANDARD 11) INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}") set(SOURCE_FILES shared.c shared.h main.c) add_library(shared SHARED ${SOURCE_FILES}) include(GenerateExportHeader) GENERATE_EXPORT_HEADER(shared # generates the export header shared_EXPORTS.h automatically BASE_NAME shared EXPORT_MACRO_NAME SHARED_EXPORTS EXPORT_FILE_NAME shared_EXPORTS.h STATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC) set(EXEC_FILES main.c) add_executable(myexe ${EXEC_FILES}) target_link_libraries(myexe shared)
但是,此cmake仅创建shared_EXPORTS
.h,libshared.dll和libshared.dll.a`文件。 我设法使用Mingw本身创建.lib文件,并将所有这些文件(包括源代码的.h文件)放入一个文件夹中,并将该文件夹放在第二个项目的根文件夹中以便使用它。
但是,我到处寻找一种方法将库链接到第二个项目的可执行文件。 cmake本身的文档假设我有一些我不知道的知识。 是否有任何命令列表可用于最终链接我的库。 我已经尝试过“使用find_package()或target_link_libraries”的通用答案无济于事。
编辑1
以下是shared.h
的内容:
#include "shared_EXPORTS.h" #ifndef SHAREDLIBSDEMO_LIBRARY_H #define SHAREDLIBSDEMO_LIBRARY_H void SHARED_EXPORTS sharedHello(void); #endif
根据@Shmuel H.的建议,我将shared
项目的shared.h
shared.c
和cmakelist.txt放入项目中我想要包含库的文件夹中。我使用了add_subdirectory()和target_link_libraries ()。
以下是项目的CMakeLists.txt
:
cmake_minimum_required(VERSION 3.7) project(projectFiles) set(CMAKE_C_STANDARD 11) include_directories(src ${maker_INCLUDE_DIR}) set(SOURCE_FILES src/nv_runner/main.c src/FactParser/FactParser.c src/FactParser/FactParser.h src/Utils/Utils.c src/Utils/Utils.h src/nv_runner/main.h) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") find_package(maker REQUIRED) include_directories(${maker_INCLUDE_DIR}) set(LIBSHARED_LOCATION ${PROJECT_SOURCE_DIR}/libshared) add_subdirectory(libshared) include_directories(${LIBSHARED_LOCATION}) add_executable(${PROJECT_NAME} ${SOURCE_FILES} src/FactParser/FactParser.c src/FactParser/FactParser.c src/FactParser/FactParser.h src/nv_runner/main.h) target_link_libraries(${PROJECT_NAME} ${maker_LIBRARY}) target_link_libraries(${PROJECT_NAME} shared)
首先,我必须从sharedHello函数中删除SHARED_EXPORTS宏,并在shared_EXPORTS.h
包含shared.h
,否则它将无法识别在其他文件中使用的函数。 但是当我运行程序时,我得到了这个结果:
Process finished with exit code -1073741515 (0xC0000135)
编辑2
项目设置图像
在屏幕截图中,我从shared
项目中获取了所有必需的文件,将其放在当前项目的目录中,并将目录标记为库。 可以在图像中看到cmake。 使用此设置,每当我运行程序时,它只会因图像中出现的错误而崩溃。
我发现了问题所在。 我不知道dll必须和exe在同一个文件夹中,这就是程序没有执行的原因。 一旦我将.dll文件放在exe文件夹中,它就可以了。 感谢这个问题帮我识别问题: C ++运行包含库文件的文件而没有编译错误(CMake / CLion)
我发现.lib文件只是MSVC编译器所必需的。 MinGW使用.dll.a
文件; 替换.lib。 这篇文章引导我发现这一点: VisualStudio和gcc之间* .dll * .a * .lib * .def的兼容性
如果我错了,请纠正我。 这是我当前项目和cmake设置的图像