【问题标题】:undefined reference errors after running cmake运行 cmake 后未定义的引用错误
【发布时间】:2012-09-20 15:21:45
【问题描述】:

我尝试使用 Cmake 构建 PhysFS 库,我使用的是 Code::Blocks mingw makefiles。我可以在我的项目中导入,我可以在技术上声明 PhysFS_init() 函数(尽管这给了我参数太少的错误)但是当我添加一个参数时它告诉我 PHYSFS_init 是一个未定义的引用。

这对我来说听起来很愚蠢,当它没有参数时你怎么能识别它,而当我添加参数时却假装它不存在?我已经运行了两次 CMake,但我只是得到了这个:

[...]\src\main.cpp|20|undefined reference to `PHYSFS_init'|

代码,如果需要的话(只是一点,其余的无关紧要):

#include <SFML/Window.hpp>
#include <SFML/System.hpp>
#include <iostream>
#include "Globals.h"
#include "GameStates.h"
#include "GameWindow.h"
#include "GameMenu.h"
#include <physfs.h>

int main(int argc, char** argv)
{
///<|===================| Classes & Declarations |===================|>
    sf::Event ev;
    sf::RenderWindow winMain ( sf::VideoMode( WindowWidth, WindowHeight, 32 ), WindowTitle );
    sf::Image Icon;
    GameStates gameState;
    GameMenu TitleMenu;
    MenuButton buttons[4];
    PHYSFS_init(NULL);

为什么会这样?我必须做什么才能在我的项目中使用 PhysFS?我用 CMake 构建了库,包含了我需要的库,我尝试初始化 PhysFS,这给了我一个错误,让我觉得 C++ 编译程序的方式很傻。

【问题讨论】:

  • 另外,我也尝试添加 argv[0] 参数,仅供参考,我在 windows XP SP3 上使用 Code::Blocks IDE
  • 你链接到图书馆了吗?听起来您包含了头文件,但实际上并未链接到定义 PHYSFS_init() 的库。
  • 你能显示 cmakelists.txt 吗?
  • 不傻,你显然还不明白。
  • 这是真的,我以前从来没有这样做过,我必须承认我没有这方面的经验,但是嘿,这就是 SO 的意义:)

标签: c++ cmake sfml physfs


【解决方案1】:

这是对 C++ 库如何工作的一般解释:

PHYSFS 可能由头文件和静态/动态库组成。头文件是声明库的所有函数/类但未定义的地方。因此,当您将头文件包含到您的项目中时,您的编译器现在可以知道您在库中调用的函数是否存在,以及它们所采用的参数类型等。

所以要使用一个库,你必须包含它的头文件,这意味着你必须将它的包含目录添加到project/cmakelists.txt中。

#some similar path to this
include_directories( /path/to/PHYSFS/include)

现在,当您实际将可执行文件链接到二进制文件时,必须“解析”这些函数,以便链接器知道它们的实际位置,以便调用它们。这称为与库的“链接”。

因此,要使用库,您必须链接其库文件。

在 cmake 中是这样完成的:

add_executable(myexe myexe.cpp)

#Add library directory paths here
link_directories( /path/to/PHYSFSlibs/)

#libPHYS.a or libPHYS.so if using gcc convention, libPHYS.lib if MSVC convention
#cmake allows us to use the name of the library, instead of the filename to be portable.
target_link_libraries(myexe PHYSFS) 

我对 PHYSFS 不是特别熟悉,但如果您将其编译为库,您应该可以链接到其中一个文件。

对 `PHYSFS_init 的未定义引用

这是“链接”的问题,通常意味着您未能链接库,或者库缺少此功能的实现。链接库应该可以解决这个问题。

编辑

我误读了您的问题,并假设您在项目中使用 cmake 并链接到 PHYSFS。

首先您必须单独构建 PHYSFS,这将根据平台/IDE 生成一个库文件(.a、.so 或 .lib),然后您必须在 C::B 链接器选项中链接该库文件。

为此:

转到项目->构建选项。单击链接器设置。

图片(来自here):

添加库。

【讨论】:

  • 我从该站点下载的 physFS 包没有 .lib 文件或 .a 文件或类似的文件,只有标题、文档和源文件。在我的项目中没有“cmakelist.txt”。另外,如何将所有这些内容添加到 CMake?
  • 我误读了您的问题,并假设您在项目中使用 cmake 并链接到 PHYSFS。在底部编辑。
  • 这是我第一次使用 cmake,所以我不知道如何构建 physfs,您可以提供任何链接或简而言之非常快速的操作方法?
  • 你可以生成 C::B 项目,或者如果你在 linux 上,或者使用 msys,它非常简单:转到 physfs 目录,创建一个名为 build 的新目录,然后转到那个目录。接下来,键入“cmake ..”,然后键入“make”。 (提示:您也可以使用cmake-gui ..,这将允许您查看 physfs 项目的所有选项)。这应该会在构建目录中的某个位置生成库文件。
  • 太棒了,非常感谢,我为此苦苦挣扎了这么长时间,我从没想过制作游戏最难的部分会是这个。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 2021-01-11
  • 2016-06-22
  • 2020-10-29
相关资源
最近更新 更多