неопределенные ошибки ссылок после запуска cmake

Я попытался собрать библиотеку 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 ++ просто глупа.

2

Решение

Это общее объяснение того, как работают библиотеки 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.

Сделать это:

Зайдите в Проект-> Опции сборки. Нажмите Настройки линкера.

Изображение (от Вот):
Настройки компоновщика в C :: B

Добавьте библиотеку.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]