[英]undefined reference errors after running cmake
我試圖用Cmake實際構建PhysFS庫,我使用的是Code :: Blocks mingw makefile。 我可以在我的項目中導入,我可以在技術上聲明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鏈接器選項中鏈接該庫文件。
去做這個:
轉到項目 - >構建選項。 單擊“鏈接器設置”。
圖片(從這里 ):
添加庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.