使用静态构建curl链接项目

2023-12-23

我正在使用 CMake 和 MinGW32 在 C++ 中做一个小项目,它需要 libcurl 库,但是当我尝试链接静态构建 libcurl.a 时,出现未定义的引用错误

undefined reference to `_imp__curl_easy_init'
undefined reference to `_imp__curl_easy_setopt'
undefined reference to `_imp__curl_easy_perform'
undefined reference to `_imp__curl_easy_getinfo'
undefined reference to `_imp__curl_easy_strerror'

我的 cURL 源代码位于 dep/curl 中,我的源代码位于 src 文件夹中。这就是我的项目的 CMakeLists.txt 的样子:

project(ShutdownServer)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_BUILD_TYPE "Release")
set(CURL_STATICLIB true)
set(BUILD_CURL_EXE false)

add_subdirectory(dep/curl)
set(TARGET_NAME "ShutdownServer")
set(LIBCURL_DIR ${PROJECT_SOURCE_DIR}/dep/curl)

aux_source_directory(src SRC_LIST)
add_executable(${TARGET_NAME} ${SRC_LIST})

find_path(LIBCURL_INCLUDE_DIR curl/curl.h HINTS ${LIBCURL_DIR}/include)
include_directories(${LIBCURL_INCLUDE_DIR})

add_dependencies(${TARGET_NAME} libcurl)

set(LIBS ${LIBS} ws2_32)
set(LIBS ${LIBS} iphlpapi)
set(LIBS ${LIBS} libcurl)

target_link_libraries(${TARGET_NAME} ${LIBS})

set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")

当我将 CURL_STATICLIB 选项切换为 false 并动态构建 libcurl 时,项目构建正常,但我宁愿将所有内容构建到一个二进制文件中。有人可以告诉我这有什么问题吗?


你需要定义CURL_STATICLIB当包含curl.h时,否则编译器会认为您正在尝试链接libcurl库的动态版本。

如果您检查curl.h,您可以看到以下几行:

/*
 * Decorate exportable functions for Win32 DLL linking.
 * This avoids using a .def file for building libcurl.dll.
 */
#if (defined(WIN32) || defined(_WIN32)) && !defined(CURL_STATICLIB)
#if defined(BUILDING_LIBCURL)
#define CURL_EXTERN  __declspec(dllexport)
#else
#define CURL_EXTERN  __declspec(dllimport)
#endif
#else

您可以看到,默认情况下,每个函数都是用__declspec(dllimport)约定,其中添加了那些_imp__符号名称的前缀。

因此,您需要在 CMakeLists.txt 中定义 CURL_STATICLIB,如下所示:

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

使用静态构建curl链接项目 的相关文章

  • 我的 std::hash for std::tuples...有什么改进吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有些人可能已经注意到 std hash 不支持元组 所以我添加了一个重载 它看起来比我到目前为止看到的解决方案 更好 有人有进一步减少这段代码的
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • std::make_pair 与浮点数组(float2,无符号整数)

    我有一个用 float2 unsigned int 对模板化的向量 例如 std vector
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 展开 std::reference_wrapper 的成本

    Given include
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • CMake 中的 FindSDL2 发生了什么?

    我在游戏中使用 SDL2 我一直使用自定义 FindSDL2 cmake 因为标准 CMake 集中没有 然而 前段时间确实出现了有关 FindSDL2 的帖子 例子 红迪网帖子 https www reddit com r opengl

随机推荐

  • 如何在 if 语句中渲染某些内容 React Native

    Problem 我在 React Native 中使用平面列表 并且想要与平面列表中的变量进行比较 如果两个变量相等则渲染一个文本组件 但如果不相等则不渲染任何内容 我尝试了很多方法来做到这一点 但没有任何效果 我希望得到一些帮助来找出一种
  • 在 JsFiddle 中打印 Var

    我如何从 JavaScript 中将某些内容打印到 JsFiddle 的结果屏幕上 我不能使用document write 它也不允许print 我应该用什么 为了能够看到输出console log 在 JSFiddle 中 转到外部资源在
  • sqlite & flex - 如果不存在则插入?

    我正在使用 flex 开发我的第一个桌面应用程序 并且我也是第一次使用 sqlite 我正在创建数据库和所有表 我还想将几行数据添加到几个表中 以便用户在首次安装时可以使用一些数据 我遇到的唯一问题是每次运行程序时它都会一遍又一遍地插入相同
  • 在构造函数中更改扩展的 RichTextBox 文本不起作用

    我有以下课程 public partial class RichTextBoxEx RichTextBox public RichTextBoxEx InitializeComponent Text Some Text 但是 当我将其放在表
  • 使用 R 将数据集中的多列重新排列为一列

    我想将我的一个数据集中的三列合并为一个变量名称为 al anim 的列 并删除所有重复项 将值 动物 ID 从最低到最高排序 然后将每个动物从 1 重新编号到 N变量名称 new id anim1 lt c 1456 2569 5489 1
  • 文件上传需要在 CodeIgniter 中进行验证

    我有 2 个文本字段和 1 个文件上传 这些都是必需的 当我只需要文本字段时 一切正常 但是当我需要上传文件时 验证错误仍然显示需要一个文件 即使我选择了一个文件 我究竟做错了什么 view fieldset fieldset
  • like '%Query%' 与全文搜索 CONTAINS 查询的性能

    我有一个情况 我想搜索单个词 对于这种情况 从性能的角度来看哪个查询会更好 Select Col1 Col2 from Table Where Col1 Like Search or Select Col1 Col2 from Table
  • 如何在 Stacey 应用程序中从逗号分隔的列表值创建链接标签?

    我希望在 Stacey 中为每个项目设置标签 类别 例如 设计 摄影 插图 等 并将每个标签 类别链接到各自的类别 例如 我的project yml 文件内容如下 title Example Person s Logo date Febru
  • 使用内置 Ruby JSON 库反序列化 JSON 原语

    为什么 Ruby 的内置 JSON 不能反序列化简单的 JSON 原语 我该如何解决这个问题 irb main 001 0 gt require json gt true irb main 002 0 gt objects 42 true
  • Rails 路由(root :to => ...)

    我知道如何将 Rails 应用程序的路由根设置为控制器和操作 但是如何添加id呢 pages show 1应该是根 我该如何设置这个 遇到了同样的问题 这对我有用 root to gt pages show id gt 1
  • 在谷歌colab中加载图像

    我的 Jupyter Notebook 有以下代码可将图像上传到 Colab from google colab import files uploaded files upload 系统提示我输入该文件 哪个被上传 我使用以下命令验证文件
  • 如何在 Next.js 中为非默认语言环境生成动态路径?

    我正在使用 next i18next 构建一个具有国际化功能的 Next js 应用程序 为我网站的所有页面生成英语和法语页面 但具有动态路由的页面除外 即 blog id blog title 对于具有动态路由的页面 会生成英语页面 但不
  • 将 url 扩展添加到 Laravel 路由

    是否可以像这样向 laravel 路由添加扩展 http www mywebsite com members login html 和另一个具有不同扩展名的页面 http www mywebsite com contactus htm 我正
  • 如何将自定义工具链添加到 eclipse CDT

    我有一个基于 gnu arm 的自定义工具链 我已经下载了带 CDT 的 eclipse IDE 我想知道如何使用 eclipse 添加我的工具链 它有一个通用工具链 即Linux GCC 除此之外就没有什么了 我想添加我的 我没有找到任何
  • 如何生成所有 Tetromino 的列表?

    如何生成所有 Tetromino 的列表 或者 更一般地说 如何生成仅限于多个单元格的多联骨牌子集 有很多方法可以做到这一点 我发现效果很好的一种选择是递归地 更普遍地思考它 尤其 单个矩形是 1 多米诺骨牌 对于任何 n 型骨牌 您可以通
  • Java FX 模块化应用程序,未找到模块(Java 11、Intellij)

    您好 我的模块化 Java FX 应用程序有问题 首先 我使用 Intellij 向导创建了一个 JavaFX 项目 我添加了 Java FX 库 JavaFX 模块得到了认可 我的模块信息 java 我还添加了虚拟机选项 但我总是收到此错
  • Xcode:需要将游戏锁定为仅纵向

    我刚刚向应用商店发布了一款游戏 然后意识到我完全忘记将其仅锁定为纵向 我需要提交一个可以做到这一点的更新版本 此时 只需转到 常规 gt 部署信息 并取消选中除 肖像 之外的所有内容 然后将其作为新版本提交就足够了吗 或者我还需要对代码做一
  • 帮助 PHP call_user_func 并将函数集成到类中?

    下面是我大约一年前发现的一个函数 它应该对内存缓存键加锁 这样您就可以更新它的值 而不会出现 2 个请求同时尝试更新键的麻烦 这是非常基本的 但我需要一些帮助来弄清楚如何 100 使用它 我不确定的部分是它在哪里传递 update函数然后传
  • 解码 Angular 6 中的 html 实体

    我正在寻找一个可以在 Angular 6 中解码 HTML 实体的库 我试图找到一些东西 我在 Angular 2 中找到了一个名为 trustashtml 的函数 但我认为 6 版本不可用 下面你可以在 html 模板中找到我的代码 di
  • 使用静态构建curl链接项目

    我正在使用 CMake 和 MinGW32 在 C 中做一个小项目 它需要 libcurl 库 但是当我尝试链接静态构建 libcurl a 时 出现未定义的引用错误 undefined reference to imp curl easy