2017-04-30 1 views
2

Je voudrais savoir s'il est possible (et si oui: comment) de compiler les bibliothèques partagées avec Go. Dire que j'ai ce code:Bibliothèques partagées de compilation croisée

package main 

import "C" 

//export DoubleIt 
func DoubleIt(x int) int { 
    return x * 2 
} 

func main() {} 

dans src/doubler/main.go. Sur Mac, je peux courir

go build -o libdoubler.dylib -buildmode=c-shared doubler 

pour obtenir une bibliothèque partagée appelée libdoubler.dylib. Similaire sur Linux, juste avec l'extension .so.

Maintenant, je voudrais utiliser Linux comme plate-forme principale pour construire mes bibliothèques (pour Mac et Windows). Quelles sont mes options?

Réglage GOOS-darwin et en cours d'exécution ci-dessus sur linux, je reçois

can't load package: package doubler: no buildable Go source files in /home/patrick/Desktop/go/src/doubler 

Toutes les idées?

Répondre

3

Le problème que vous rencontrez est pas vraiment sur la compilation des bibliothèques partagées ou exécutables, mais sur l'utilisation cgo et essayant de compiler. (Toutefois, si vous voulez une bibliothèque, pas un exécutable, le nom du package ne doit pas être main.)

Lors de la compilation croisée, cgo est désactivé par défaut. Si vous ajoutez la variable d'environnement CGO_ENABLED=1, votre exemple fonctionnera:

CGO_ENABLED=1 GOOS=darwin go build -o libdoubler.dylib -buildmode=c-shared doubler 

Gardez à l'esprit que l'utilisation CGO en cross-compilation sera lourde. Vous devez vous assurer que les bibliothèques C de la plate-forme cible sont prêtes sur votre ordinateur hôte. Si ce n'est pas vraiment nécessaire, restez à l'écart de l'amour-propre. Si vous devez le faire, vous pouvez envisager de compiler sur la machine cible au lieu de gérer la compilation croisée avec cgo.

+0

Pour dire, ne fonctionne pas sur ma machine. ld ignore les drapeaux et gcc renvoie le statut de sortie 1 – Uvelichitel

+0

'package main' et' -buildmode = c-shared' ne fonctionneront pas ensemble. J'ai supposé que le PO était conscient de cela comme une autre réponse a déjà déclaré ce problème. J'ai édité ma réponse pour clarifier ce point. Merci beaucoup! – hasanyasin

+0

J'ai toujours mal orthographié CGO_ENABLED ... Maintenant, il "fonctionne" dans le sens où il ne renvoie plus d'erreur. Je voudrais que la solution aurait été sans installer un environnement de compilation croisée. – topskip

0

lors de la construction d'une utilisation client:

package main 

... la construction mais une utilisation de la bibliothèque:

package mylibname 
+0

Cela ne fonctionne pas. Les mêmes résultats qu'avant. – topskip