我试图用Cmake来构建PhysFS库,我使用的是Code::Blocks mingw makefiles。我可以在我的项目中导入,可以从技术上声明PhysFS_init()函数(尽管这给我带来了很少的参数错误),但是当我添加参数时,它告诉我PHYSFS_init是 undefined reference 。
这对我来说听起来很愚蠢,当没有参数时如何识别它,却在添加参数时假装它不存在?我已经运行了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++编译程序的方式很愚蠢。
最佳答案
这是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并不是特别熟悉,但是如果您将其编译为库,则应该具有要链接到的这些文件之一。
这是“链接”的问题,通常意味着您无法链接库,或者库缺少此功能的实现。链接库应解决此问题。
编辑
我误解了您的问题,并假设您在项目中使用cmake并链接到PHYSFS。
首先,您必须分别构建PHYSFS,这将根据平台/ IDE生成一个库文件(.a,.so或.lib),然后必须在C::B链接器选项中链接该库文件。
去做这个:
转到项目->构建选项。单击链接器设置。
图片(来自here):
添加库。