【问题标题】:Linker error with CMakeCMake 的链接器错误
【发布时间】:2016-07-15 17:30:27
【问题描述】:

我正在使用 JetBrains CLion 进行纯 C (C ANSI) 开发,我知道它的目标是 C++,但我的公司只使用 C 和 CLion 仅使用 CMake 作为构建系统。

我的系统是Debian Jessie系统,安装了sqlite3和libsqlite3-dev。

我正在尝试像这样构建一个简单的 sqlite3 项目:

#include <sqlite3.h>
#include <stdio.h>

    int main() {
    sqlite3 *sqlConnection;
    int ret;
    ret = sqlite3_open("database/path.db, &sqlConnection);
    if (ret) {
        printf("Ups ... can't open %d", ret);
    }
    do_some_queries(sqlConnection);
    return 0;
}

自动生成的 CMakeLists.txt 如下。

cmake_minimum_required(VERSION 3.3)


project(Project)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp )
add_executable(Project ${SOURCE_FILES})

在构建时,无论是通过 Clion,还是通过命令行,都会出现链接器错误:

...
undefined reference to `sqlite3_prepare_v2'
undefined reference to `sqlite3_column_int'
undefined reference to `sqlite3_open'
...

我知道我必须向 CMake 指出 sqlite3 的位置,但我找不到这样做的方法。

“find_package”和“find_library”可能会这样做,但我找不到方法。

我也找到了this Cmake file,但是没能成功使用。

那么,如何将 sqlite3 与 Cmake 集成?

【问题讨论】:

  • 将sqlite3.c 添加到来源。
  • @CL。你说下载sqlite3源代码和项目一起编译?我已经尝试过并且遇到了其他链接器错误(线程等),而且,不喜欢在系统周围复制源代码。会努力的。

标签: sqlite cmake


【解决方案1】:

您需要将 sqlite 头文件的路径添加到包含路径中。然后使用target_link_libraries链接sqlite库:

https://cmake.org/cmake/help/v3.3/command/target_link_libraries.html

【讨论】:

  • 这个 libsqlite3-dev 已经将 sqlite3.h 放在 gcc 路径上,与 -lsqlite3 选项相同,那么我如何在 Cmake 上为底层 GCC 发送“-lsqlite3”选项?
  • 你没看懂答案吧? sqlite3 应该通过 target_link_libraries 添加。
  • 那么 target_link_libraries(sqlite3) 应该工作吗? @usr1234567 @克里斯蒂亚诺
【解决方案2】:

我已经找到了一种解决方法,但这不是正确的做法。

由于在 Debian 上“gcc main.c -lsqlite3”有效(安装了 libsqlite3-dev),将 -lsqlite3 标志传递给链接器就可以了。

所以我改变了

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

到

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lsqlite3")

它奏效了。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-01-27
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多