簡體   English   中英

“未定義引用”共享庫(新手)中的許多功能(全部?)

[英]“undefined reference to” many (all?) of the functions in shared library (newbie)

我是C ++的新手。 如果這不連貫,請耐心等待。 我被要求在最初基於OS X的Linux上構建一個大型系統,在該系統上運行良好。 原作者不再在公司任職。 生成系統使用了自動工具,但是還有一些手工生成的Makefile,它們遍歷整個系統,稱為自動生成的Makefile。 我設法編譯了所有的c ++代碼。 該構建系統還使用libtools,並且生成了共享庫並將其存儲在/ usr / local / lib中。

所以現在我想使用這些庫。 我編寫了一個簡短的程序,該程序僅實例化ds_dictionary類的對象並調用其方法之一。 這里是:

#include <iostream>
#include <DSUtils/DSUtils.h>

int main (int argc, char * const argv[]) {

    int32_t integer_data=123;
    char key_alice_integer[] = "alice_integer"; 

    ds_dictionary my_dict;
    my_dict.add_int(key_alice_integer, integer_data);

    return 0;
}

我用這個編譯

g++ -lDSUtils -o main my_test_code.cpp

結果:

//usr/local/lib/libDSUtils.so: undefined reference to `ds_breakdown_from_time_interval'
//usr/local/lib/libDSUtils.so: undefined reference to `ds_date_breakdown_with_string'
//usr/local/lib/libDSUtils.so: undefined reference to `ds_seconds_duration_of_interval'
...  (about 25 lines like these)
collect2: ld returned 1 exit status

讓我們看一下庫:

garyp@VM:/usr/local/lib$ nm libDSUtils.so | grep ds_breakdown_from_time
    U ds_breakdown_from_time_interval
  1. 上一行中的“ U” ...是否表示庫構建不正確?
  2. 我可以正確調用g ++嗎?
  3. 我是否必須在代碼中添加一些內容以告知我正在使用該庫中的函數?
  4. 有哪些可能的錯誤? 我應該從哪里開始玩轉?

編輯:啊哈。 DSUtils庫是從幾種c ++來源構建的。 源代碼中有一個c程序,它包含所有問題函數。 Makefile系統根本不處理那個c文件。 該c程序會編譯。 理想情況下,我想我會弄清楚如何修改Makefile來編譯該文件並將其添加到庫中,但是我還沒弄清楚如何做到這一點。

我可以將.o文件添加到現有庫中嗎? 怎么樣? 用一個文件創建一個庫? 等等?

EDIT_2:我只是做了

g++ -o main -lDSUtils main.o my_new_objectfile.o

東西可以編譯,鏈接並運行而不會出錯。 應該行嗎? 修復邏輯錯誤后,它確實可以工作。

這個

U ds_breakdown_from_time_interval

告訴我ds_breakdown_from_time_interval將在運行時由另一個庫解析。 因此,我猜測您需要鏈接到定義ds_breakdown_from_time_interval的庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM