2013-09-24 136 views
0

我正在使用C++和Qt Creator進行編程。我需要在我的項目文件夾中包含我正在使用的庫,以便程序可以在任何設備上實現。我應該怎麼做?將庫包含到我的項目文件夾中

我知道我應該修改.pro文件,我已經嘗試過這樣的:

LIBS+=-L"$$_PRO_FILE_PWD_/libs" \ 
-lvl \ 

但它不工作。我得到這個錯誤: 加載共享庫時出錯:libvl.so:無法打開共享對象文件:沒有這樣的文件或目錄

任何想法?? 謝謝

+0

究竟是什麼問題?編譯器沒有找到庫?如果'lvl'是一個庫,則需要添加一個'-l'前綴來實際將它添加到要鏈接的庫的列表中。 – thokra

+0

它給出了這個錯誤:加載共享庫時出現的錯誤: :libvl.so:無法打開共享對象文件:沒有這樣的文件或目錄 – triple13

+0

@thokra是的我已經把它作爲-lvl在我的程序中,但是當我複製粘貼到論壇 - 已經過去了:D – triple13

回答

0

首先,在Linux上,qmake生成用於控制構建過程的Makefiles。當您添加行

LIBS+=-L"$$_PRO_FILE_PWD_/libs" -lvl 

.pro文件,qmake可以看到它,適當的Makefile文件的目標是產生它告訴鏈接器$$_PRO_FILE_PWD_/libs並鏈接到搜索其他庫庫libvl.so鏈接的可執行文件。

但是,您遇到的是運行時問題。更具體地說,ld-linux.so.2將嘗試查找並動態加載共享庫,如libvl.so,在運行時。這發生在使用內置的加載可執行文件時,如/usr/lib和用戶定義(和/或分佈定義)的路徑。關於ld-linux.so.2man page,ldconfig,我將其引用到相應的man page,其中ldconfig用於以標準方式配置用戶定義的庫搜索路徑。

ld-linux.so.2試圖找到庫,它搜索良好定義的組目錄(所有冒號分隔)按以下順序:

  • 如果存在的話,所謂的DT_RPATH,其可以被寫入到一個可執行庫(已棄用)。
  • LD_LIBRARY_PATH(至少對於大多數可執行文件,看到異常的man page)
  • 它取代了DT_RPATH(如果有的話),但延遲的查找之後才LD_LIBRARY_PATH已被處理DT_RUNPATHRPATHRUNPATH可用於模擬Windows上的行爲,其中也搜索可執行文件的路徑。然而,LD_LIBRARy_PATH更適合於此目的。
  • 本其中通過在/etc/ld.so.conf/以及可能的附加文件中指定ldconfig使用目錄生成的高速緩存文件/etc/ld.so.cache庫名稱或者通過包含直接提及的ld.so.conf或另有規定
  • 可信目錄/lib/usr/lib

如果上面提到的路徑都不包含適當的共享對象,您將收到一個錯誤消息,說明它不能被ld-linux.so.2加載。

你的情況的解決方案是簡單又進來一些品種:

  • 在執行程序前,設置使用export LD_LIBRARY_PATH={yourSearchPaths}LD_LIBRARY_PATH環境變量。
  • LD_LIBRARY_PATH添加到命令行上對可執行文件的調用,例如, LD_LIBRARY_PATH={yourSearchPaths} ./{executable}
  • 提供可執行的啓動shell腳本,例如, start.sh,它爲你做了上面的事情,然後簡單地執行shell腳本./start.sh
+0

與沒有評論的人一起投票是什麼? – thokra

+0

@ thokra ..感謝這麼多的詳細解釋..我改變了.pro文件中的行爲:'LIBS + = - L「$$ PWD/libs」-lvl「,它沒有工作..我試了整個項目在另一個設備..這裏是驚喜..它完美的作品..即使一切都是相同的兩個設備..可能只是QT Creator版本是不同的..多謝你這麼多:) – triple13

+0

@ triple13:什麼你的意思是用* device *?另外,QtCreator簡單地解析相應的IDE中的'.pro'文件。 QtCreator不會在構建時或運行時貢獻(除了啓動可執行文件和可能指定的工作目錄之外)。 – thokra

相關問題