每當我建立使用DMD靜態庫,我可以將其鏈接到我的應用程序,它編譯罰款,但隨時在應用程序的庫被稱爲我得到:如何編譯/鏈接的靜態庫與DMD
Segmentation fault (core dumped)
對於構建庫我
# $(FILE) for each file in "find source -name "*.d"
# $(OBJ) is $(FILE) with the extension ".o"
# $(IMP) is $(FILE) with the extension ".di"
dmd -O -d -m64 -L-ldl -m64 -Isource -c $(FILE) -ofbuild/$(OBJ)
ar rcs ./lib/libvibe.d-dmd.a build/*
ranlib ./lib/libvibe.d-dmd.a
dmd -O -d -m64 -L-ldl -m64 -Isource -c -o- $(FILE) -Hfimport/$(IMP)
和構建應用程序
SRC = $(shell find src -name "*.d")
dmd -debug -odbuild -I../../vibe.d/source -L-L../../vibe.d/lib -L-lvibe.d-dmd $(SRC) -ofbin/test
我是什麼做錯了?
更新
編譯vibe.d作爲libvibe.d-dmd.a
dmd -g -lib -oflib/libvibe.d-dmd.a $(SOURCES) -L-levent_pthreads -L-levent -L-lssl -L-lcrypto
示例代碼:
import vibe.core.file;
void main()
{
openFile("test.d", FileMode.Read);
}
編譯示例
dmd -g test.d vibe.d/lib/libvibe.d-dmd.a -Ivibe.d/source
有些GDB輸出:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004554f5 in vibe.core.file.openFile() (mode=<incomplete type>, path=...) at source/vibe/core/file.d:29
29 return getEventDriver().openFile(path, mode);
(gdb) backtrace
#0 0x00000000004554f5 in vibe.core.file.openFile() (mode=<incomplete type>, path=...) at source/vibe/core/file.d:29
#1 0x000000000044f7d2 in vibe.core.file.openFile() (mode=<incomplete type>, path=...) at source/vibe/inet/path.d:24
#2 0x000000000044f539 in D main() at test.d:5
#3 0x000000000046b9e4 in rt.dmain2.main()()
#4 0x000000000046b35e in rt.dmain2.main()()
#5 0x000000000046ba2b in rt.dmain2.main()()
#6 0x000000000046b35e in rt.dmain2.main()()
#7 0x000000000046b2e9 in main()
(gdb) fram 2
#2 0x000000000044f539 in D main() at test.d:5
5 openFile("test.d", FileMode.Read);
(gdb) frame 1
#1 0x000000000044f7d2 in vibe.core.file.openFile() (mode=<incomplete type>, path=...) at source/vibe/inet/path.d:24
24 struct Path {
(gdb) print mode
$1 = <incomplete type>
好,它有可能是無關的鏈接或編譯。分段錯誤表明您的程序存在內存訪問問題。維基百科鏈接http://en.wikipedia.org/wiki/Segmentation_fault。你也應該刪除gcc標籤,因爲你的問題與它沒有關係。 – undu
@undu錯誤地鏈接的應用程序將segfault(當延遲函數指針時) –
@undu直接從DMD的鏈接中的dlang.org部分:「實際的鏈接是通過運行gcc完成的。」 –