我目前在 Clion 上有两个使用 cmake 的 C 项目。其中一个项目名为“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)
Run Code Online (Sandbox Code Playgroud)
但是,此 cmake 仅创建shared_EXPORTS
.h、libshared.dll 和 libshared.dll.a` 文件。我设法使用 Mingw 本身创建 .lib 文件,并将所有这些文件(包括源代码的 .h 文件)放入一个文件夹中,并将该文件夹放在第二个项目的根文件夹中以便使用它。
但是,我到处寻找将库链接到第二个项目的可执行文件的方法。cmake 本身的文档假设我拥有大量的知识,但我却没有。是否有任何命令列表可以用来最终链接我的库。我已经尝试过“使用 find_package() 或 target_link_libraries”的通用答案,但无济于事。
以下为内容shared.h
:
#include "shared_EXPORTS.h"
#ifndef SHAREDLIBSDEMO_LIBRARY_H
#define SHAREDLIBSDEMO_LIBRARY_H
void SHARED_EXPORTS sharedHello(void);
#endif
Run Code Online (Sandbox Code Playgroud)
根据@Shmuel H的建议。我将shared.h
shared.c
项目的cmakelist.txtshared
放入我想要包含库的项目中的一个文件夹中。我使用了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)
Run Code Online (Sandbox Code Playgroud)
首先,我必须从sharedHello函数和shared_EXPORTS.h
include中删除SHARED_EXPORTS宏shared.h
,否则它将无法识别在其他文件中使用的函数。但是当我运行该程序时,我得到了这个结果:
Process finished with exit code -1073741515 (0xC0000135)
Run Code Online (Sandbox Code Playgroud)
在屏幕截图中,我从项目中获取了所有必需的文件shared
,将其放置在当前项目的目录中,并将该目录标记为库。cmake 可以在图像中看到。通过这种设置,每当我运行程序时,它都会崩溃并出现图像中看到的错误。
我发现问题是什么了。我不知道 dll 必须与 exe 位于同一文件夹中,这就是程序无法执行的原因。一旦我将 .dll 文件放入 exe 文件夹中,它就起作用了。归功于这个问题帮助我识别问题:C++ running file with Included library failed without compiling error (CMake / CLion)
我发现 .lib 文件仅是 MSVC 编译器所必需的。MinGW使用该.dll.a
文件;替换.lib。这篇文章让我发现了这一点:Compatibility of *.dll *.a *.lib *.def Between VisualStudio and gcc
如果我错了,请纠正我。这是我当前项目和 cmake 设置的图像
归档时间: |
|
查看次数: |
8692 次 |
最近记录: |