libourown.so
提供了函数f
定义
执行gcc命令后,
gcc a.o libourown.so.1 -o app
1)
在libourown.so
中调用app
时,f
是否会在运行时与app
相关联?或libourown.so
在构建时是否与app
相关联?
2)
在libc.so
中调用app
之后,printf
是否会在app
上与libc.so
相关联?或app
在构建时是否与.controller('RequestForRideCtrl', function ($scope, $ionicHistory, $http, $ionicPopup, $state, $window, $compile,$timeout) {
var Slat, Slng, Dlat, Dlng;
var Slatlng, Destination;
$scope.location = {};
$scope.location1 = {};
$scope.init = function () {
var Smarker, Dmarker;
var flag;
var myLatlng = new google.maps.LatLng(19.9975, 73.7898);
var mapOptions = {
center: myLatlng,
zoom: 16,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map"),
mapOptions);
var contentString = "<div><a ng-click=''>Click</a></div>";
var compiled = $compile(contentString)($scope);
var infowindow = new google.maps.InfoWindow({
content: compiled[0]
});
navigator.geolocation.getCurrentPosition(function (pos) {
$scope.map.setCenter(new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude));
Slat = pos.coords.latitude;
Slng = pos.coords.longitude;
var myLatlng = new google.maps.LatLng(Slat, Slng);
$scope.map.setCenter(myLatlng);
Smarker = new google.maps.Marker({
position: myLatlng,
map: $scope.map,
draggable: true,
title: 'Source',
label: 'S'
});
google.maps.event.addListener(Smarker, 'drag', function (event) {
var lat = document.getElementById("latbox").value = this.getPosition().lat();
var lng = document.getElementById("lngbox").value = this.getPosition().lng();
Slatlng = new google.maps.LatLng(lat, lng);
flag=1;
getPosition(Slatlng, flag);
})});
$scope.$on('destination', function (evt, value) {
$scope.variable = value;
var Dlat = $scope.variable.geometry.location.lat();
var Dlng = $scope.variable.geometry.location.lng();
var myLatlngD = new google.maps.LatLng(Dlat, Dlng);
$scope.map.setCenter(myLatlngD);
var Dmarker = new google.maps.Marker({
position: myLatlngD,
map: $scope.map,
draggable: true,
title: 'Destination',
label: 'D'
});
google.maps.event.addListener(Dmarker, 'drag', function (event) {
var lat = document.getElementById("latbox1").value = this.getPosition().lat();
var lng = document.getElementById("lngbox1").value = this.getPosition().lng();
Destination = new google.maps.LatLng(lat, lng);
flag = 0;
getPosition(Destination, flag);
});
function getPosition(marker, flag) {
if (flag == 1) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({'latLng': marker}, function (results, status) {
if (status === google.maps.GeocoderStatus.OK) {
if (results[1]) {
$scope.location.formatted_address = results[1].formatted_address;
$timeout(function () {
$scope.$apply(function () {
console.log('in source');
});
}, 2000);
} else {
console.log('Location not found');
}
} else {
console.log('Geocoder failed due to: ' + status);
}
});
}
else {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({'latLng': marker}, function (results, status, element) {
if (status === google.maps.GeocoderStatus.OK) {
if (results[1]) {
$scope.location1.formatted_address = results[1].formatted_address;
$timeout(function () {
$scope.$apply(function () {
console.log('in des');
});
}, 2000);
} else {
console.log('Location not found');
}
} else {
console.log('Geocoder failed due to: ' + status);
}
});
}
}
相关联?
答案 0 :(得分:2)
答案与你的两个问题相同。共享库没有内置到您的可执行文件中(这是它们首先出现的主要原因之一!)。
当您运行应用程序时,drynamic链接器/加载器ld.so
会加载必要的库。
您可以通过运行以下命令查看应用程序所需的共享库:
$ ldd ./app
在命令行上。
您可能会发现这对于理解Linux上的共享库非常有用:how to write shared libraries
答案 1 :(得分:1)
回答你的问题“libourown.so是否在运行时链接到应用程序,在应用程序中调用f?或libourown.so是否在构建时链接到应用程序?”
动态库一进入ram就会被链接。同样的答案对你的两个问题都有效。完成此类链接称为加载时间链接。
另一种方法是使用运行时链接的概念。使用像dlopen(),dlsym()
这样的函数答案 2 :(得分:0)
共享对象的重点在于它不会静态链接到您的可执行文件,而是放在内存中并为需要它的人提供服务。
答案 3 :(得分:0)
无法静态链接到libourown.so
文件:此文件缺少链接器工作所必需的信息。如果您需要静态链接到libourown.a
,则有两种选择:
生成库的静态版本libourown.so
,并链接到
使用statifier之类的工具在您的可执行文件中嵌入-static
。
默认情况下,Libc动态链接到可执行文件。您可以使用--wrap
选项静态链接到它。应该注意的是,静态链接到libc将弊大于利,因为您的可执行文件正在使用的其他库可能会再次链接到libc 动态,并且两次链接到同一个库会导致灾难