2013-06-05 33 views
11

Tôi đang cố gắng viết một số ràng buộc C cho ngôn ngữ Go, và đã chạy vào một tình huống dính khi thiết lập trình biên dịch Cgo trong Windows. Tôi có mã trông giống như sau:Có thể sử dụng các biến môi trường trong bình luận CFLAGS của cgo không?

// #cgo windows CFLAGS: -I C:/dev/extlibs/include/ 
// #cgo windows LDFLAGS: -lMyLib -L C:/dev/extlibs/lib/ 
// #include <mylib/mylib.h> 
import "C" 

đó là cho phép tôi để tránh cài đặt các file DLL, libs, và các tập tin tiêu đề trực tiếp vào C của tôi: thư mục \ Windows, nhưng không cho phép nhiều sự linh hoạt khi các nhà phát triển khác đang làm việc với một thiết lập hệ thống tập tin khác (tất cả đều cần libs trong C:/dev/extlibs/...).

Có cách nào tôi có thể tham chiếu biến môi trường từ bên trong mã không? Có lẽ một cái gì đó dọc theo dòng:

// #cgo windows CFLAGS: -I $EXTLIBS$/include/ 

Hoặc có cách nào khác để mọi người giải quyết vấn đề này mà tôi đã bỏ lỡ không? Tôi đã dành một số thời gian googling xung quanh về chủ đề này và đã không nhìn thấy nhiều mà đã được hữu ích, vì vậy bất kỳ thông tin và/hoặc tài nguyên có thể là một trợ giúp thực sự!

Trả lời

7

Bạn có thể thử sử dụng các biến môi trường, Gentoo Linux Wiki page on Safe C Flags có một ví dụ trong các định dạng sau

CXXFLAGS="${CFLAGS}" 

Vì vậy, bạn có thể làm điều gì đó như

// #cgo windows CFLAGS: -I "${EXTLIBS}"/include/ 

nhưng cú pháp của tôi có thể và có thể là Makefile cụ thể.

Bạn cũng có thể thử cài đặt một CPATH environment variable đó:

xác định một danh sách các thư mục được tìm kiếm như thể chỉ định với -I, nhưng sau khi bất kỳ đường dẫn được đưa ra với tùy chọn -I trên dòng lệnh. Biến môi trường này được sử dụng bất kể ngôn ngữ nào đang được xử lý trước.

Tương đương với -L là, tôi nghĩ, LIBRARY_PATH (Được mô tả tại liên kết CPATH).

Theo http://golang.org/cmd/cgo/ một loại cách được khuyến nghị để giải quyết vấn đề này theo cách độc lập nền tảng là sử dụng pkg-config.

// #cgo pkg-config: mylib otherlib 

Nó có sẵn cho các cửa sổ (http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/) và có một số chi tiết thông tin về cài đặt nó ở this question (How to install pkg config in windows?)

Ngoài ra, đặt tất cả các phụ thuộc vào một thư mục con của go-mã, sử dụng đường dẫn tương đối trong số CFLAGSLDFLAGS và chia sẻ toàn bộ gói với các nhà phát triển khác.

+0

Đó là một số ý tưởng hay. Tôi sẽ thử. FWIW, tôi sử dụng pk-config trên darwin/linux, nhưng nó luôn luôn có vẻ rắc rối hơn một chút so với giá trị của nó trên Windows trong quá khứ. –

+0

@ChrisCovert Vâng, tôi mất một thời gian để phân loại các phụ thuộc vào Win8 :-(Có nó cuối cùng mặc dù, liên kết SO câu hỏi có một vài liên kết tốt trong các ý kiến ​​ – Intermernet

+0

FWIW, tôi nghĩ rằng tôi sẽ cung cấp cho thử pkg-config và xem liệu nó có hoạt động tốt hơn một chút so với lần trước hay không. –

13

Theo docs for CGO:

Khi xây dựng, các CGO_CFLAGS, CGO_CPPFLAGS, CGO_CXXFLAGS và biến môi trường CGO_LDFLAGS được thêm vào lá cờ có nguồn gốc từ các chỉ thị.Các cờ cụ thể của gói nên được đặt bằng cách sử dụng các chỉ thị , chứ không phải các biến môi trường, để xây dựng công việc trong các môi trường chưa sửa đổi .

Sử dụng kiến ​​thức này, tôi đã thành công khi xây dựng một third-party package that wraps a C library miễn là nó cung cấp nó làm gói hệ thống. Ví dụ tôi liên kết với:

package sdl 

// #cgo LDFLAGS: -lSDL2 
// #include <SDL2/SDL.h> 
import "C" 

Mặc dù nó chỉ định một gói hệ thống cho SDL2, và tôi có SDL2 được cài đặt trong một số thư mục không thuộc hệ thống, tôi có thể vẫn xây dựng gói này sử dụng một số biến môi trường tôi được đề cập, chẳng hạn như:

export SDL_PATH=/home/mark/where/I/installed/sdl 
CGO_CFLAGS="-I$SDL_PATH/include" CGO_LDFLAGS="-L$SDL_PATH/lib" go build hello.go 
LD_LIBRARY_PATH="$SDL_PATH/lib" ./hello 

Tất nhiên, đây là Linux, nhưng bạn có thể sử dụng cùng ý tưởng trong Windows.

Các vấn đề liên quan