2

私は基本的にCmakeを使用してPhysFSライブラリを構築しようとしましたが、使用したのはCode :: Blocksmingwmakefilesでした。プロジェクトにインポートできますが、技術的にはPhysFS_init()関数を宣言できますが(引数のエラーが少なすぎます)、引数を追加すると、PHYSFS_initが未定義の参照であることがわかります。

それは私にはとてもばかげているように聞こえますが、引数がないときにどうやってそれを認識できますが、引数を追加するときに存在しないふりをしますか?私はCMakeを2回実行しましたが、これを取得しているだけです。

[...]\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++がプログラムをコンパイルする方法がばかげているように感じるエラーが発生しました。

4

1 に答える 1

9

これは、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に特に精通していませんが、ライブラリとしてコンパイルした場合は、これらのファイルの1つにリンクする必要があります。

`PHYSFS_initへの未定義の参照

これは「リンク」の問題であり、通常、ライブラリのリンクに失敗したか、ライブラリにこの関数の実装がないことを意味します。ライブラリをリンクすると、これが修正されるはずです。

編集

私はあなたの質問を読み間違えました、そしてあなたがあなたのプロジェクトでcmakeを使用していて、PHYSFSにリンクしていると仮定しました。

まず、プラットフォーム/ IDEに応じてライブラリファイル(.a、.soまたは.lib)を生成するPHYSFSを個別にビルドする必要があります。次に、そのライブラリファイルをC::Bリンカーオプションでリンクする必要があります。

これをする:

[プロジェクト]->[ビルドオプション]に移動します。[リンカー設定]をクリックします。

画像(ここから): C::Bのリンカー設定

ライブラリを追加します。

于 2012-09-28T18:16:03.323 に答える