Я попытался собрать библиотеку PhysFS с помощью Cmake, я использовал кодовые файлы Code :: Blocks mingw. Я могу импортировать в свой проект, я могу технически объявить функцию 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 ++ просто глупа.
Это общее объяснение того, как работают библиотеки C ++:
PHYSFS, вероятно, состоит из заголовочных файлов и статической / динамической библиотеки. В заголовочном файле все функции / классы библиотеки объявлены, но не определены. Таким образом, когда вы включаете файл заголовка в свой проект, ваш компилятор может теперь знать, что функции, которые вы вызываете в библиотеке, существуют, и какие именно параметры они принимают и т. Д.
Таким образом, чтобы использовать библиотеку, вы должны включить ее заголовочные файлы, что означает, что вы должны добавить ее каталог include в файл 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, которая будет создавать файл библиотеки (.a, .so или .lib) в зависимости от платформы / IDE, затем вы должны связать этот файл библиотеки в опциях компоновщика C :: B.
Сделать это:
Зайдите в Проект-> Опции сборки. Нажмите Настройки линкера.
Изображение (от Вот):
Добавьте библиотеку.
Других решений пока нет …