链接共享dll库cmake clion项目

2023-12-15

我目前在 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)

然而,这个cmake只创建shared_EXPORTS.h、libshared.dll 和 libshared.dll.a` 文件。 我设法使用 Mingw 本身创建 .lib 文件,并将所有这些文件(包括源代码的 .h 文件)放入一个文件夹中,并将该文件夹放在第二个项目的根文件夹中以便使用它。

但是,我到处寻找将库链接到第二个项目的可执行文件的方法。 cmake 本身的文档假设我拥有大量的知识,但我却没有。是否有任何命令列表可以用来最终链接我的库。我已经尝试过“使用 find_package() 或 target_link_libraries”的通用答案,但无济于事。

EDIT 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.c和 cmakelist.txt 的shared项目到我想要包含库的项目中的文件夹中。我使用了 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)

EDIT 2

项目设置图像

在屏幕截图中,我已从shared项目,将其放置在当前项目的目录中,并将该目录标记为Library。 cmake 可以在图像中看到。通过这种设置,每当我运行程序时,它都会崩溃并出现图像中看到的错误。


我发现问题是什么了。我不知道 dll 必须与 exe 位于同一文件夹中,这就是程序无法执行的原因。一旦我将 .dll 文件放入 exe 文件夹中,它就起作用了。 感谢这个问题帮助我确定了问题:包含库的 C++ 运行文件失败,但没有编译错误(CMake / CLion)

我发现 .lib 文件仅是 MSVC 编译器所必需的。 MinGW 使用.dll.a文件;替换.lib。这篇文章让我发现了这一点:VisualStudio 和 gcc 之间 *.dll *.a *.lib *.def 的兼容性

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链接共享dll库cmake clion项目 的相关文章

  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • CMake 创建可执行文件时未定义的引用

    我是 CMake 新手 我正在尝试编译我的项目 该项目创建了一些静态库和一些可执行文件 下面是我拥有的文件结构的示例 PROJECT SRC 子项目 1该文件夹的 cpp 所有源文件 和CMakeLists txt 1 创建静态库 子项目
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • UIKit Dynamics:识别圆形形状和边界

    我正在编写一个应用程序 我使用 UIKit Dynamics 来模拟不同圈子之间的交互 我使用以下代码创建我的圈子 self super initWithFrame CGRectMake location x radius 2 0 loca
  • SQLite 中嵌套内连接的问题

    下面的sql语句不会在SQLite中运行 select from A left join B inner join C on B fkC C pk on A optionalfkB B pk 我收到 sqlException 未知列 B p
  • 如何在Python中创建表?

    这就是我想在 Python 中复制的内容 这些是存储数据的变量的名称 name 1 Alex name 2 Zia age 1 13 age 2 12 game 1 1 game 2 2 favourite 1 chess favourit
  • 如何在 .Rmd 文件中添加要发布的功能或缩略图

    我目前正在尝试使用 blogdown 设置一个 Hugo 博客 但找不到从内部向帖子添加功能或缩略图的方法 Rmd文件 这会喜欢这样宁静峰主题 据我了解 只需添加一些如下语法即可在 md 文件中轻松完成 featuredImage img
  • Python Pyrebase 配置

    当我尝试运行我的代码时 import pyrebase firebaseConfig apiKey xxxxxx authDomain xxxxxx projectId xxxxxx storageBucket xxxxxxx servic
  • PREG_MATCH 检查所有单词和条件

    我编写了一个正则表达式 它在 OR 条件下搜索搜索词 这样就提供了字符串中的三个单词 无论它们的顺序如何 现在我只想放置一个 AND 条件 因为我想同时以不同的顺序在字符串中获取所有三个单词 这是我的preg match 正则表达式 myP
  • bash eval 未检测到 System.exit 返回代码

    挣扎了一个小时 java代码 ULogger info throwing out 666 System exit 666 bash 包装器 eval COMMAND TO RUN ret code printf error code d r
  • Python:无头模式支持旧版本的 Chrome

    我正在尝试使用 python 和 selenium 自动发送短信https voice google com about 当我运行下面的代码时 它会获取最新版本 谷歌浏览器实例并且工作正常 但是 当我以无头模式运行它时 它使用旧版本的谷歌浏
  • 使用python排序词频计数

    我必须使用 python 计算文本中的词频 我想到将单词保存在字典中并计算每个单词的数量 现在 如果我必须根据出现次数对单词进行排序 我可以使用相同的字典来完成此操作 而不是使用以键作为计数 以单词数组作为值的新字典吗 WARNING 此示
  • 在哪里可以更改“电子邮件已被占用”错误消息?

    我需要自定义消息错误 Email has already been taken对于电子邮件 我正在使用 Ruby 1 9 2 Rails 3 1 3 Devise 1 5 3 我尝试更改以下消息 config locales devise
  • 使用 NSDictionary 对象写入 plist 文件

    抱歉 我看到了类似的问题 但他们似乎没有给我一些完整的答案 我试着把它整理好 这样人们就不会讨厌我或我糟糕的英语 我正在使用带有故事板和 ARC 的 Xcode 4 2我可以从我的 plist 文件中读取 我的任务只是将更新后的值写回我的
  • Mathematica 输出格式

    Mathematica 如何决定何时对输出中的数字进行舍入 例如 给出输入 250000 5 给出输出 2500001 While 25000 5 确实打印为 25000 5 N 在这里也没有帮助 我需要使用 NumberForm 让它实际
  • 连接到 Oracle 中的拆分字符串列

    我的数据库中有一个列 其中包含 4 个字段作为 分隔字符串 我已经拆分了这些字段 因为我在报告中需要单独使用它们 我还需要单独使用这些字段作为针对另一个表的条件 我尝试过的事情 临时表 CREATE GLOBAL TEMPORARY TAB
  • 如何从 cordova-sqlite 同步获取数据?

    是否可以从cordova sqlite同步获取数据 我有一张桌子caseTable包含字段 ID 案例名称 日期 该表中的每一行对应于另一个以 caseName 字段命名的表 我需要循环遍历caseTable表并获取所引用表中的行数 fun
  • PHP 将“”添加到任何 xml 输出

    不确定发生了什么 但这是我的代码 template
  • Raycaster 中的高效地板/天花板渲染

    我在 Raycaster 引擎上工作了一段时间 我在较慢的机器上运行 我遇到的最具挑战性的问题是高效的地板和天花板铸造 我的问题是 我还可以使用什么其他更快的方法 我不确定末日地板和天花板是如何渲染的 到目前为止我尝试了两种典型的解决方案
  • 通过 JDBC 使用 Google Apps 脚本连接到 MSSQL Server 时出错

    我正在尝试使用 Google Apps 脚本连接到 Microsoft SQL Server 我正在使用 SQL Server 2008 R2 并且正在使用建议的脚本之一 该脚本应该读取数据并将其放入电子表格中 https develope
  • 在shell脚本中解析wmic的输出

    我正在尝试解析 WMIC 的输出 然后获取 PID 我的脚本如下 echo off setLocal enableExtensions enableDelayedExpansion FOR F tokens 1 delims A IN wm
  • 在 XAMPP for Windows 上从 CPAN 安装 perl 模块

    我对 Perl 很生疏 我认为在 Windows 中运行它没有帮助 我想安装this模块 我尝试了说明here安装 CPAN 模块 但尝试安装 App cpanminus 失败 第一步 我尝试运行cpan Config Simple它也不起
  • 链接共享dll库cmake clion项目

    我目前在 Clion 上有两个使用 cmake 的 C 项目 其中一个项目名为 sharedLibsDemo 我试图在该项目中创建一个共享库 在另一个项目中 我想使用由 共享 项目创建的库 目前 在 sharedLibsDemo 项目中 我