链接共享dll库cmake clion项目

时间:2017-04-28 13:06:50

标签: c dll cmake clion

我目前在Clion上使用cmake有两个C项目。其中一个项目名为" sharedLibsDemo"我正在尝试在此项目中创建一个共享库。在另一个项目中,我想使用由" shared"创建的库。项目。

目前,在" 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本身的文档假定我有一些我不知道的知识。是否有任何命令列表可用于最终链接我的库。我已经尝试了#34的通用答案;使用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.h shared.cshared项目的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

Project setup image

在屏幕截图中,我从shared项目中获取了所有必需的文件,将其放在当前项目的目录中,并将目录标记为库。可以在图像中看到cmake。使用此设置,每当我运行程序时,它只会因图像中出现的错误而崩溃。

1 个答案:

答案 0 :(得分:2)

我发现了问题所在。我不知道dll必须和exe在同一个文件夹中,这就是程序没有执行的原因。一旦我将.dll文件放在exe文件夹中,它就可以了。 感谢您帮助我确定问题:C++ running file with included library failes without compiling error (CMake / CLion)

我发现.lib文件只是MSVC编译器所必需的。 MinGW使用.dll.a文件;替换.lib。这篇文章引导我发现这一点:Compatibility of *.dll *.a *.lib *.def between VisualStudio and gcc

如果我错了,请纠正我。这是我当前项目的image和cmake设置