首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行cmake后出现未定义的引用错误

运行cmake后出现未定义的引用错误
EN

Stack Overflow用户
提问于 2012-09-29 02:03:01
回答 1查看 4.8K关注 0票数 2

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

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

代码语言:javascript
复制
[...]\src\main.cpp|20|undefined reference to `PHYSFS_init'|

代码,如果有必要的话(只有一小部分,其余的都是无关的):

代码语言:javascript
复制
#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++编译程序的方式太愚蠢了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-29 02:16:03

这是对C++库工作原理的一般解释:

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

因此,要使用库,您必须包含它的头文件,这意味着您必须将它的include目录添加到项目/cmakelists.txt。

代码语言:javascript
复制
#some similar path to this
include_directories( /path/to/PHYSFS/include)

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

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

在cmake中,这是按如下方式完成的:

代码语言:javascript
复制
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,它将根据平台/集成开发环境生成库文件(.a、.so或.lib),然后您必须在C::B链接器选项中链接该库文件。

为此,请执行以下操作:

进入Project->Build options。单击链接器设置。

图片(来自here):

添加库。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12645117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档